/*
无亲缘关系
进程 1:每隔 1 秒向屏幕打印时间信息,收到信号将时间写到文件中
进程 2:ctrl+c发信号给进程2,然后进程2的ctrl+c信号处理函数
	负责发信号给进程1


进程1


注册信号处理函数
定义信号处理函数
	将时间字符串写到文件中
循环打印时间字符串到屏幕

用有名管道把pid写进去


------------------------------------
进程2
	
注册ctrl+c信号处理函数
定义ctrl+c信号处理函数
	kill(pid, SIGUSR1)
一直休眠


进程2怎么拿到进程1的pid呢???
用有名管道把pid读出来


*/


#include <stdio.h>
#include <stdlib.h>
#include <signal.h>
#include <unistd.h>
#include <errno.h>
#include <time.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>



void sig_handler(int signo)
{
	FILE *fp;
	time_t tm;
	if (signo == SIGUSR1) {
		printf("接收到SIGUSR1信号\n");
		//时间字符串写到文件中
		if ((fp = fopen("time.txt", "a")) == NULL) {
			perror("fopen");
			exit(1);
		}
		time(&tm);
		fputs(ctime(&tm), fp);
		fclose(fp);
	}
}

int main(int argc, char const *argv[])
{
	pid_t pid;
	int fd;
	time_t tm;
	pid = getpid();
	signal(SIGUSR1, sig_handler); //注册信号处理函数
	
	if (argc < 2) {
		printf("usage : %s <fifo name> \n", argv[0]);
		exit(1);
	}
	#if 1
	if (mkfifo(argv[1], 0666) < 0) {
		perror("mkfifo");
		exit(1);
	}
	#endif
	if ((fd = open(argv[1], O_RDWR)) < 0) {
		perror("open");
		exit(1);
	}
	write(fd, &pid, sizeof(pid)); //被自己的pid写入管道

	while (1) {
		//打印时间字符串到屏幕
		time(&tm);
		printf("%s", ctime(&tm));
		sleep(1);
	}
	close(fd);

	return 0;
}

